/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mrp.persistencia.controller;

import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import mrp.persistencia.entity.Materiaprima;
import mrp.persistencia.entity.Inventario;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.transaction.UserTransaction;
import mrp.beans.util.EntityManagerUtil;
import mrp.persistencia.controller.exceptions.IllegalOrphanException;
import mrp.persistencia.controller.exceptions.NonexistentEntityException;
import mrp.persistencia.controller.exceptions.PreexistingEntityException;
import mrp.persistencia.controller.exceptions.RollbackFailureException;
import mrp.persistencia.entity.Cuero;

/**
 *
 * @author root
 */
public class CueroJpaController implements Serializable {

    public CueroJpaController() {
        
        this.emf = EntityManagerUtil.getEntityManagerFactory();
    }

    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }
    public void create(Cuero cuero) throws IllegalOrphanException, PreexistingEntityException, RollbackFailureException, Exception {
        List<String> illegalOrphanMessages = null;
//        Materiaprima materiaprimaOrphanCheck = cuero.getMateriaprima();
//        if (materiaprimaOrphanCheck != null) {
//            Cuero oldCueroOfMateriaprima = materiaprimaOrphanCheck.getCuero();
//            if (oldCueroOfMateriaprima != null) {
//                if (illegalOrphanMessages == null) {
//                    illegalOrphanMessages = new ArrayList<String>();
//                }
//                illegalOrphanMessages.add("The Materiaprima " + materiaprimaOrphanCheck + " already has an item of type Cuero whose materiaprima column cannot be null. Please make another selection for the materiaprima field.");
//            }
//        }
        if (illegalOrphanMessages != null) {
            throw new IllegalOrphanException(illegalOrphanMessages);
        }
        EntityManager em = null;
        try {
            
            em = getEntityManager();
            em.getTransaction().begin();
//            Materiaprima materiaprima = cuero.getMateriaprima();
//            if (materiaprima != null) {
//                materiaprima = em.getReference(materiaprima.getClass(), materiaprima.getCodmateriaprima());
//                cuero.setMateriaprima(materiaprima);
//            }
            Inventario inventario = cuero.getInventario();
            if (inventario != null) {
                inventario = em.getReference(inventario.getClass(), inventario.getCodinventario());
                cuero.setInventario(inventario);
            }
            em.persist(cuero);
//            if (materiaprima != null) {
//                materiaprima.setCuero(cuero);
//                materiaprima = em.merge(materiaprima);
//            }
            if (inventario != null) {
                Cuero oldCueroFkOfInventario = inventario.getCueroFk();
                if (oldCueroFkOfInventario != null) {
                    oldCueroFkOfInventario.setInventario(null);
                    oldCueroFkOfInventario = em.merge(oldCueroFkOfInventario);
                }
                inventario.setCueroFk(cuero);
                inventario = em.merge(inventario);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            try {
                em.getTransaction().rollback();
            } catch (Exception re) {
                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
            }
            if (findCuero(cuero.getCodmateriaprima()) != null) {
                throw new PreexistingEntityException("Cuero " + cuero + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Cuero cuero) throws IllegalOrphanException, NonexistentEntityException, RollbackFailureException, Exception {
        EntityManager em = null;
        try {
            
            em = getEntityManager();
            em.getTransaction().begin();
            Cuero persistentCuero = em.find(Cuero.class, cuero.getCodmateriaprima());
//            Materiaprima materiaprimaOld = persistentCuero.getMateriaprima();
//            Materiaprima materiaprimaNew = cuero.getMateriaprima();
            Inventario inventarioOld = persistentCuero.getInventario();
            Inventario inventarioNew = cuero.getInventario();
            List<String> illegalOrphanMessages = null;
//            if (materiaprimaNew != null && !materiaprimaNew.equals(materiaprimaOld)) {
//                Cuero oldCueroOfMateriaprima = materiaprimaNew.getCuero();
//                if (oldCueroOfMateriaprima != null) {
//                    if (illegalOrphanMessages == null) {
//                        illegalOrphanMessages = new ArrayList<String>();
//                    }
//                    illegalOrphanMessages.add("The Materiaprima " + materiaprimaNew + " already has an item of type Cuero whose materiaprima column cannot be null. Please make another selection for the materiaprima field.");
//                }
//            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
//            if (materiaprimaNew != null) {
//                materiaprimaNew = em.getReference(materiaprimaNew.getClass(), materiaprimaNew.getCodmateriaprima());
//                cuero.setMateriaprima(materiaprimaNew);
//            }
            if (inventarioNew != null) {
                inventarioNew = em.getReference(inventarioNew.getClass(), inventarioNew.getCodinventario());
                cuero.setInventario(inventarioNew);
            }
            cuero = em.merge(cuero);
//            if (materiaprimaOld != null && !materiaprimaOld.equals(materiaprimaNew)) {
//                materiaprimaOld.setCuero(null);
//                materiaprimaOld = em.merge(materiaprimaOld);
//            }
//            if (materiaprimaNew != null && !materiaprimaNew.equals(materiaprimaOld)) {
//                materiaprimaNew.setCuero(cuero);
//                materiaprimaNew = em.merge(materiaprimaNew);
//            }
            if (inventarioOld != null && !inventarioOld.equals(inventarioNew)) {
                inventarioOld.setCueroFk(null);
                inventarioOld = em.merge(inventarioOld);
            }
            if (inventarioNew != null && !inventarioNew.equals(inventarioOld)) {
                Cuero oldCueroFkOfInventario = inventarioNew.getCueroFk();
                if (oldCueroFkOfInventario != null) {
                    oldCueroFkOfInventario.setInventario(null);
                    oldCueroFkOfInventario = em.merge(oldCueroFkOfInventario);
                }
                inventarioNew.setCueroFk(cuero);
                inventarioNew = em.merge(inventarioNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            try {
                em.getTransaction().rollback();
            } catch (Exception re) {
                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
            }
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String id = cuero.getCodmateriaprima();
                if (findCuero(id) == null) {
                    throw new NonexistentEntityException("The cuero with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(String id) throws NonexistentEntityException, RollbackFailureException, Exception {
        EntityManager em = null;
        try {
            
            em = getEntityManager();
            em.getTransaction().begin();
            Cuero cuero;
            try {
                cuero = em.getReference(Cuero.class, id);
                cuero.getCodmateriaprima();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The cuero with id " + id + " no longer exists.", enfe);
            }
//            Materiaprima materiaprima = cuero.getMateriaprima();
//            if (materiaprima != null) {
//                materiaprima.setCuero(null);
//                materiaprima = em.merge(materiaprima);
//            }
            Inventario inventario = cuero.getInventario();
            if (inventario != null) {
                inventario.setCueroFk(null);
                inventario = em.merge(inventario);
            }
            em.remove(cuero);
            em.getTransaction().commit();
        } catch (Exception ex) {
            try {
                em.getTransaction().rollback();
            } catch (Exception re) {
                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Cuero> findCueroEntities() {
        return findCueroEntities(true, -1, -1);
    }

    public List<Cuero> findCueroEntities(int maxResults, int firstResult) {
        return findCueroEntities(false, maxResults, firstResult);
    }

    private List<Cuero> findCueroEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Cuero.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Cuero findCuero(String id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Cuero.class, id);
        } finally {
            em.close();
        }
    }

    public int getCueroCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Cuero> rt = cq.from(Cuero.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    public List<Cuero> findCueroWhereOrderBy(String consulta,boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
//            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
//            cq.select(cq.from(Cliente.class));
//            Query q = em.createQuery(cq);
//            Query q = em.createQuery("SELECT o FROM Cliente o where "+ +" order by o.numerocliente");
            Query q = em.createQuery(consulta);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }
}
